package thread;

/**
 * 线程提供一个方法：
 * void join()
 * 该方法可以允许一个线程在另一个线程上等待(阻塞)，直到其执行完毕后才结束
 * 等待继续后续工作
 * 所以可以使用该方法协调线程的同步运行
 *
 * 线程的两种执行方式
 * 同步运行：线程执行时出现了先后顺序工作
 * 一步运行：线程执行时各干各的，并发本身就是异步运行的
 */
public class JoinDemo {
    //标识图片是否下载完毕
    public static boolean isFinish = false;
    public static void main(String[] args) {
        /*
            isFinish不能作为局部变量的原因在于：
            java语法要求，当一个方法的局部内部类中引用了该方法的某个
            局部变量时，该方法必须是final的，而final的变量又不可以在
            局部内部类中被第二次赋值，因此不满足我们下面的使用需求
         */
        //boolean isFinish = false;
        Thread download = new Thread(){
            public void run(){
                System.out.println("down:开始下载图片");
                for (int i=1;i<100;i++) {
                    System.out.println("down"+i+"%");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                    }
                }
                System.out.println("down：图片下载完毕");
                isFinish = true;
            }

        };

        Thread show = new Thread(){
            public void run(){
                System.out.println("文字显示完毕……");
                System.out.println("show：开始显示图片……");
                System.out.println("show:开始等待download");
                try {
                        download.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("show:等待download完毕！");

                if(!isFinish){
                    throw new RuntimeException(("图片加载失败！"));
                }
                System.out.println("show:显示图片完毕");
            }
        };
        download.start();
        show.start();
    }
}
